/*****************************
 *@file: FrozenSummon
 *@author: 陈吕唐
 *@desc: 冰冻范围：创造出一块冰冻区域，使敌人每秒受到200%攻击力伤害，并每秒附加一层寒冷效果。寒冷:每层附带10%减速，持续6秒，叠加四层后清除减速效果并晕眩1秒。
 *@date: 2024-03-26	11:38
 *****************************/
import { _decorator, error } from 'cc';
import { BaseCharacter } from '../BaseCharacter';
import IBaseBulletValue from '../bullet/IBaseBulletValue';
import { BaseSummon } from './BaseSummon';
const { ccclass, property } = _decorator;

@ccclass('FrozenSummon')
export class FrozenSummon extends BaseSummon {
    /****************************************************************************************************************
     *Readonly 常量
     ****************************************************************************************************************/

    /**
     * 当前效果是否激活中
     */
    private _activeEffect: boolean = false;


    /**
     * 持续时间
     */
    private CONTINUE_TIME: number = 6;


    /**
     * 在范围内的单位
     */
    private set: Set<BaseCharacter> = new Set();
    /****************************************************************************************************************
     *Property 定义变量
     ****************************************************************************************************************/
    /**
     * 子弹伤害数据
     */
    public value: IBaseBulletValue = undefined!;


    /**
     * 持续时间
     */
    private time: number = 0;


    private _activeTime: number = 1;

    /***************************************************************
     *PropertyUI 引用的控件
     ***************************************************************/

    /****************************************************************************************************************
     * Lifecycle 生命周期相关方法
     ****************************************************************************************************************/
    protected lateUpdate(dt: number): void {
        if (!this._activeEffect) {
            return;
        }
        this.time -= dt;
        this.activeTime -= dt;
        if (this.time <= 0) {
            this.activeEffect = false;
        }
    }
    /****************************************************************************************************************
     * Public 公有方法
     ****************************************************************************************************************/
    /**
     * 开始生效
     */
    public applySummon(): void {
        // this.value = value;
        this._activeEffect = true;
        this.enabled = true;
    }





    /**
     * 失效
     */
    public removeSummon() {
        this._activeEffect = false;
        // this.enabled = false;
        this.node.removeFromParent();
    }
    /****************************************************************************************************************
     * private 私有方法
     ****************************************************************************************************************/
    private effect() {
        this.activeTime = 1;
        this.set.forEach(character => {
            character.takeDamage(this.value)
        })
    }

    protected onSensor(character: BaseCharacter): void {
        this.set.add(character);
    }

    protected onLeave(character: BaseCharacter): void {
        this.set.delete(character);
    }
    /****************************************************************************************************************
     * Property Get && Set 属性的 get && set 函数
     ****************************************************************************************************************/
    public get activeEffect(): boolean {
        return this._activeEffect;
    }

    protected set activeEffect(value: boolean) {
        if (this._activeEffect == value) {
            return;
        }

        if (value) {
            error("BaseBuff.activeBuff: 启用BUFF失败");
            error("应当调用applyBuff方法")
            return;
        }

        this._activeEffect = value;

        if (!value) {
            this.removeSummon();
        }
    }

    public get activeTime(): number {
        return this._activeTime;
    }
    public set activeTime(value: number) {
        this._activeTime = value;
        if (value <= 0) {
            this.effect();
        }
    }
}

